﻿using BLevy.Entidad;
using Microsoft.Reporting.WinForms;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace BLevy.UI
{
    public partial class frmCertificadoReporte : Form
    {
        private int socio_id { get; set; }
        DataTable dataSource = new DataTable();

        public frmCertificadoReporte(int id)
        {
            socio_id = id;
            InitializeComponent();

            dataSource.Columns.Add("SOCIO_ID");
            dataSource.Columns.Add("SOCIO_APELLIDO");
            dataSource.Columns.Add("SOCIO_NOMBRES");
            dataSource.Columns.Add("SOCIO_FEC_NAC");
            dataSource.Columns.Add("SOCIO_VIG");
            dataSource.Columns.Add("SOCIO_DOC");
            dataSource.Columns.Add("SOCIO_DIRECCION");
            dataSource.Columns.Add("SOCIO_TELEFONO");
            dataSource.Columns.Add("SOCIO_EDAD");
            dataSource.Columns.Add("SOCIO_COSTO_BASE");
            dataSource.Columns.Add("ADHE_NOM");
            dataSource.Columns.Add("ADHE_APE");
            dataSource.Columns.Add("ADHE_DOC");
            dataSource.Columns.Add("ADHE_FEC_NAC");
            dataSource.Columns.Add("ADHE_VIG");
            dataSource.Columns.Add("ADHE_PAREN");
            dataSource.Columns.Add("ADHE_EDAD");
            dataSource.Columns.Add("ADHE_ADICIONAL");
        }

        private void frmCertificadoReporte_Load(object sender, EventArgs e)
        {

            //var query = (from fila in Negocio.Adherentes.FindByIdSocio(socio_id)
            //            join socio in Negocio.Socios.FindAll() on new {socio = fila.socio_id} equals new {socio = socio.id}
            //            join plan in Negocio.Planes.FindAll() on new {plan = socio.plan_id} equals new {plan = plan.id}
            //            select new
            //            {
            //                SOCIO_ID = socio.id,
            //                SOCIO_APELLIDO = socio.apellido,
            //                SOCIO_NOMBRES = socio.nombres,
            //                SOCIO_FEC_NAC = socio.fecha_nacimiento,
            //                SOCIO_VIG = socio.vigencia,
            //                SOCIO_DOC = socio.documento,
            //                SOCIO_DIRECCION = socio.direccion,
            //                SOCIO_TELEFONO = socio.telefono,
            //                SOCIO_EDAD = socio.edad,
            //                ADHE_NOM = fila.nombres,
            //                ADHE_APE = fila.apellido,
            //                ADHE_DOC = fila.documento,
            //                ADHE_FEC_NAC = fila.fecha_nacimiento,
            //                ADHE_VIG = fila.vigencia,
            //                ADHE_PAREN = fila.parentesco,
            //                ADHE_EDAD = fila.edad,
            //                SOCIO_COSTO_BASE = plan.costo_base

            //            }).ToList();
            try
            {
                Socio _socio = Negocio.Socios.FindById(socio_id);
                Plan _plan = Negocio.Planes.FindById(_socio.plan_id);
                IList<AdicionalPlan> adicionalesPlanL = Negocio.Planes.FindAdicionalesByPlan(_plan.id);
                IList<Adherente> adherentesL = Negocio.Adherentes.FindByIdSocio(_socio.id);

                int hijos = 0;
                int otros = 0;

                foreach (Adherente _adherente in adherentesL)
                {
                    //DataRow fila = new DataRow();
                    DataRow fila = dataSource.NewRow();

                    fila["SOCIO_ID"] = socio_id;
                    fila["SOCIO_APELLIDO"] = _socio.apellido;
                    fila["SOCIO_NOMBRES"] = _socio.nombres;
                    fila["SOCIO_FEC_NAC"] = _socio.fecha_nacimiento;
                    fila["SOCIO_VIG"] = _socio.vigencia;
                    fila["SOCIO_DOC"] = _socio.documento;
                    fila["SOCIO_DIRECCION"] = _socio.direccion;
                    fila["SOCIO_TELEFONO"] = _socio.telefono;
                    fila["SOCIO_EDAD"] = _socio.edad;

                    fila["ADHE_NOM"] = _adherente.nombres;
                    fila["ADHE_APE"] = _adherente.apellido;
                    fila["ADHE_DOC"] = _adherente.documento;
                    fila["ADHE_FEC_NAC"] = _adherente.fecha_nacimiento;
                    fila["ADHE_VIG"] = _adherente.vigencia;
                    fila["ADHE_PAREN"] = _adherente.parentesco;
                    fila["ADHE_EDAD"] = _adherente.edad;

                    double adicionalCostoBase = 0;
                    double adicional = 0;
                    TimeSpan span = new TimeSpan();

                    if (adicionalesPlanL != null)
                    {
                        span = DateTime.Now.Date - _socio.fecha_nacimiento;
                        int edad_socio = (int)Math.Truncate(span.TotalDays / 365.25);
                        if (edad_socio > _plan.edad_titular)
                        {
                            adicionalCostoBase += adicionalesPlanL.Where(ad => ad.edad_desde <= edad_socio && ad.edad_hasta >= edad_socio).Select(ad => ad.costo_adicional).Single();
                        }
                        if (_adherente.parentesco == "C")
                        {
                            span = DateTime.Now.Date - _adherente.fecha_nacimiento;
                            int edad_conyuge = (int)Math.Truncate(span.TotalDays / 365.25);

                            if (_plan.conyuge == 1)
                            {
                                if (edad_conyuge > _plan.edad_conyuge)
                                {
                                    adicional += adicionalesPlanL.Where(ad => ad.edad_desde <= edad_conyuge && ad.edad_hasta >= edad_conyuge).Select(ad => ad.costo_adicional).Single();
                                }
                            }
                            else
                            {
                                adicional += adicionalesPlanL.Where(ad => ad.edad_desde <= edad_conyuge && ad.edad_hasta >= edad_conyuge).Select(ad => ad.costo_adicional).Single();
                            }

                        }
                        else if (_adherente.parentesco == "H")
                        {
                            span = DateTime.Now.Date - _adherente.fecha_nacimiento;
                            int edad_hijo = (int)Math.Truncate(span.TotalDays / 365.25);

                            if (_plan.hijos == 1 && _plan.cantidad_hijos > hijos)
                            {
                                if (edad_hijo > _plan.edad_hijos)
                                {
                                    adicional += adicionalesPlanL.Where(ad => ad.edad_desde <= edad_hijo && ad.edad_hasta >= edad_hijo).Select(ad => ad.costo_adicional).Single();
                                }
                                else
                                {
                                    hijos++;
                                }
                            }
                            else
                            {
                                adicional += adicionalesPlanL.Where(ad => ad.edad_desde <= edad_hijo && ad.edad_hasta >= edad_hijo).Select(ad => ad.costo_adicional).Single();
                            }
                        }
                        else
                        {
                            span = DateTime.Now.Date - _adherente.fecha_nacimiento;
                            int edad_otro = (int)Math.Truncate(span.TotalDays / 365.25);

                            if (_plan.otros == 1 && _plan.cantidad_otros > otros)
                            {
                                if (edad_otro > _plan.edad_otros)
                                {
                                    adicional += adicionalesPlanL.Where(ad => ad.edad_desde <= edad_otro && ad.edad_hasta >= edad_otro).Select(ad => ad.costo_adicional).Single();
                                }
                                else
                                {
                                    otros++;
                                }
                            }
                            else
                            {
                                adicional += adicionalesPlanL.Where(ad => ad.edad_desde <= edad_otro && ad.edad_hasta >= edad_otro).Select(ad => ad.costo_adicional).Single();
                            }
                        }
                    }

                    fila["SOCIO_COSTO_BASE"] = _plan.costo_base + adicionalCostoBase;
                    fila["ADHE_ADICIONAL"] = adicional;

                    dataSource.Rows.Add(fila);
                }

                ReportDataSource rds = new ReportDataSource();
                rds = new ReportDataSource("DataSet1", dataSource);

                this.reportViewer1.LocalReport.ReportEmbeddedResource = "BLevy.UI.Reportes.CertificadoReporte.rdlc";
                this.reportViewer1.LocalReport.DataSources.Add(rds);

                this.reportViewer1.ZoomMode = Microsoft.Reporting.WinForms.ZoomMode.PageWidth;
                this.reportViewer1.RefreshReport();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error : " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

        }
    }
}
